package com.bestcem.xm.ticket.dao;

import com.bestcem.xm.ticket.controller.param.PageParam;
import com.bestcem.xm.ticket.dao.dto.TicketConfigInfo;
import com.bestcem.xm.ticket.dao.dto.TicketConfigV3Info;
import com.bestcem.xm.ticket.entity.mongo.TicketConfig;
import com.bestcem.xm.ticket.enums.TicketConfigStateEnum;
import com.bestcem.xm.ticket.service.dto.PageDTO;

import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;

/**
 * @author XiaoYunSong <ys.xiao@idiaoyan.com>
 * @version v1.0
 * @date 2021/8/16 16:46
 */
public interface TicketConfigDao {

    /**
     * 根据id查询 TicketConfig
     *
     * @param id TicketConfigId
     * @return TicketConfig 信息
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/8/16 16:53
     */
    TicketConfig findById(String id);

    /**
     * 根据name查询 TicketConfig
     *
     * @param title TicketConfigId
     * @return TicketConfig 信息
     * @author gy.liu
     * @date 2021/8/16 16:53
     */
    TicketConfig findByTitle(String title);

    /**
     * 查询问卷下对应标题的工单规则
     * 注意: 不包括被软删除的 TicketConfig
     *
     * @param surveyId 问卷id
     * @param title    标题
     * @return TicketConfig 信息
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/8/18 14:08
     */
    TicketConfig findBySurveyIdAndTitle(String surveyId, String title);

    /**
     * 根据公司id查询对应公司下所有的 TicketConfig
     * 注意: 包括被软删除的 TicketConfig
     *
     * @param orgId 公司id
     * @return 所有匹配的 TicketConfig 信息
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/8/16 16:54
     */
    List<TicketConfig> listByOrgId(String orgId);

    /**
     * 查询可用的行动规则配置
     *
     * @param orgId
     * @return
     */
    List<TicketConfig> listByOrgIdEnable(String orgId);

    /**
     * 根据公司id分页查询对应公司下所有的 TicketConfig(隐含surveyId去重)
     * 注意: 包括被软删除的 TicketConfig
     *
     * @param orgId 公司id
     * @param param 分页参数
     * @return 分页DTO
     * @author zq.ding<zq.ding @ idiaoyan.com>
     * @date 2021/8/16 16:54
     */
    PageDTO<TicketConfig> listByOrgId(String orgId, PageParam param);

    /**
     * 根据问卷项目id查询对应问卷项目下所有的 TicketConfig
     * 注意: 不包括被软删除的 TicketConfig
     *
     * @param surveyId          问卷项目id
     * @param descByCreatedTime 是否根据 created_dt 这个字段倒序
     * @return 所有匹配的 TicketConfig 信息
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/8/16 16:55
     */
    List<TicketConfig> listBySurveyId(String surveyId, Boolean descByCreatedTime);

    /**
     * 保存工单配置
     *
     * @param ticketConfig
     * @return TicketConfig
     * @version v1.0
     * @author gy.liu
     * @date 2021/8/16
     */
    TicketConfig saveTicketConfig(TicketConfig ticketConfig);

    /**
     * 查询工单配置列表
     *
     * @param orgId    组织id
     * @param surveyId 问卷id
     * @param status   工单配置状态
     * @return List<TicketConfig>
     * @author jy.zhao
     * @date 2021/8/17 18:25
     **/
    List<TicketConfig> listTicketConfig(String orgId, String surveyId, Integer status);


//    /**
//     * 生成工单配置连表查询
//     * 连 DS_TICKET_TICKETFLOW 表
//     * 连 DS_TICKET_TICKETTEMPLATE 表
//     * 连 DS_TICKET_TICKETRULE 表
//     * 连 DS_TICKET_TICKETNOTIFYCONFIG 表
//     *
//     * @return 连表查询聚合对象
//     * @author lh
//     * @date 2021/8/17 21:54
//     */
//    List<AggregationOperation> genLookupStage();
//
//    /**
//     * 生成工单配置连表查询 v3
//     * 连 DS_TICKET_TICKETFLOW 表
//     * 连 DS_TICKET_TEMPLATE_V2 表
//     * 连 DS_TICKET_TICKETRULE 表
//     * 连 DS_TICKET_TICKETNOTIFYCONFIG 表
//     *
//     * @return 连表查询聚合对象
//     * @author lh
//     * @date 2021/8/17 21:54
//     */
//    List<AggregationOperation> genLookupStageV3();

    /**
     * 查询工单配置详情信息
     *
     * @param id 工单配置id
     * @return 工单配置详情信息
     * @author lh
     * @date 2021/8/17 21:54
     */
    List<TicketConfigInfo> listTicketConfigInfo(String id);

    /**
     * 查询工单配置详情信息
     *
     * @param id 工单配置id
     * @return 工单配置详情信息
     * @author lh
     * @date 2021/8/17 21:54
     */
    List<TicketConfigV3Info> listTicketConfigV3Info(String id);

    /**
     * 更新工单规则标题
     *
     * @param id    工单规则id
     * @param title 标题
     * @return 更新结果
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/8/18 14:21
     */
    boolean updateTitle(String id, String title);

    /**
     * 更新工单规则状态
     *
     * @param id    工单规则id
     * @param state 状态
     * @return 更新结果
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/8/18 14:35
     */
    boolean updateState(String id, TicketConfigStateEnum state);

    /**
     * 更新工单规则
     *
     * @param id
     * @param ticketConfig
     * @return
     */
    String updateTicketConfig(String id, TicketConfig ticketConfig);

    /**
     * 更新工单通知配置ids
     *
     * @param id                    工单配置id
     * @param ticketNotifyConfigIds 知配置ids
     * @return UpdateResult
     * @author jy.zhao
     * @date 2021/9/8 23:02
     **/
    void updateTicketNotifyConfigIds(String id, List<String> ticketNotifyConfigIds);

    /**
     * 根据模板id和类型查询工单规则
     *
     * @param templateId 模板id
     * @return tickerConfig
     * @author xuan.yang
     * @date 2021/9/13 13:52
     **/
    TicketConfig findByTemplateId(String templateId, Integer type);

    /**
     * @param surveyId
     * @param title
     * @return
     */
    long countEnabledBySurveyId(String surveyId, String title);

    /***
     * 将引用模板id更新为默认的模板id
     * @param type
     * @param orgId
     * @param templateId
     * @return
     */
    Integer updateDefaultTemplateId(Integer type, String orgId, String templateId, String oldTemplateId);

    /**
     * 根据orgId和分页参数获取TicketConfig
     *
     * @param orgId
     * @param pageParam
     * @return com.bestcem.xm.ticket.service.dto.PageDTO<com.bestcem.xm.ticket.entity.mongo.TicketConfig>
     * @author zq.ding <zq.ding@idiaoyan.com>
     * @date 2021/9/26 10:41
     */
    PageDTO<TicketConfig> pageTicketConfig(String orgId, PageParam pageParam);

    /**
     * 在工单config表中查询详情模板id，如果存在则将该id返回
     *
     * @param id 模板id
     * @return 模板id
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 21:22 2021/9/8
     */
    String queTemplateDetailId(String id);

    /**
     * 在工单config表中查询处理模板id，如果存在则将该id返回
     *
     * @param id 模板id
     * @return 模板id
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 21:57 2021/9/8
     */
    String queTemplateHandleId(String id);

    /**
     * 得到最近使用的模板
     *
     * @param orgId
     * @param userId
     * @return
     */
    TicketConfig getRecentUseTemplate(String orgId, String userId);


    /**
     * 获取公司下所有开启了工单的问卷id
     *
     * @param orgId 公司id
     * @return 问卷id列表
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/11/9 11:27
     */
    LinkedHashSet<String> groupSurveyId(String orgId);


    /**
     * 批量查询 TicketConfig
     *
     * @param ids id list
     * @return TicketConfig 列表
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/11/16 15:39
     */
    List<TicketConfig> listByIds(Collection<String> ids);

    /**
     * 根据问卷id获取所有可用的规则名称
     *
     * @param surveyId 问卷id
     * @return
     */
    List<String> listEnabledBySurveyId(String surveyId);


    /**
     * 搜索并分页查询 TicketConfig
     *
     * @param orgId     租户id
     * @param search    搜索关键词
     * @param pageParam 分页参数
     * @return 搜索分页结果
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/12/17 17:28
     */
    PageDTO<TicketConfig> searchAndPage(String orgId, String search, PageParam pageParam);


    /**
     * 根据工单规则名称关键词搜索工单规则
     *
     * @param orgId  租户id
     * @param search 搜索关键词
     * @return 工单id
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/12/17 17:28
     */
    List<String> searchTicketConfigId(String orgId, String search);
}